package com.guyu.common.core.util;


import cn.hutool.core.date.DateField;
import cn.hutool.core.date.DatePattern;
import cn.hutool.core.date.DateTime;
import cn.hutool.core.date.DateUtil;
import cn.hutool.core.date.TemporalAccessorUtil;

import java.text.SimpleDateFormat;
import java.time.LocalDateTime;
import java.time.ZoneId;
import java.time.ZonedDateTime;
import java.time.temporal.TemporalAccessor;
import java.util.Calendar;
import java.util.Date;
import java.util.Objects;

/**
 * 时间工具类
 */
public class GuyuDateUtils {

    /**
     * 获取某天的结束时间(不包括毫秒值）
     * 例如：2024-12-18 11:37:37.933 >>> 2024-12-18 23:59:59
     */
    public static DateTime endOfDay(Date date) {
        if (date == null) {
            return null;
        }
        return DateUtil.ceiling(date, DateField.DAY_OF_MONTH, true);
    }

    /**
     * 获取某天的结束时间(不包括毫秒值）
     * 例如：2024-12-18 11:37:37.933 >>> 2024-12-18 23:59:59
     */
    public static Calendar endOfDay(Calendar calendar) {
        if (calendar == null) {
            return null;
        }
        return DateUtil.ceiling(calendar, DateField.DAY_OF_MONTH, true);
    }

    /**
     * 截取秒级别时间，即忽略毫秒部分
     * 例如：2024-12-18 11:37:37.933 >>> 2024-12-18 11:37:37
     *
     * @param date 日期
     * @return {@link DateTime}
     */
    public static DateTime beginOfSecond(Date date) {
        if (date == null) {
            return null;
        }
        return DateUtil.beginOfSecond(date);
    }


    /**
     * {@link LocalDateTime} 转换为 {@link Date}，使用系统默认时区
     *
     * @param localDateTime {@link LocalDateTime}
     * @return {@link Date}
     */
    public static Date toDate(LocalDateTime localDateTime) {
        ZonedDateTime zdt = localDateTime.atZone(ZoneId.systemDefault());
        return Date.from(zdt.toInstant());
    }

    /**
     * 获取当前毫秒级时间字符串，日期格式：yyyyMMddHHmmssSSS
     */
    public static String nowMillis() {
        return DateUtil.format(new DateTime(), DatePattern.PURE_DATETIME_MS_PATTERN);
    }

    /**
     * {@link Long} 转换为 {@link Date}
     *
     * @param millisecond 毫秒，如果需要秒级别时间戳，请自行×1000
     * @return {@link Date}
     */
    public static DateTime date(Long millisecond) {
        if (millisecond == null) {
            return null;
        }
        return DateUtil.date(millisecond);
    }

    /**
     * 获取 {@link Date} 的时间戳
     *
     * @param date 日期
     * @return 时间戳
     */
    public static Long getTime(Date date) {
        if (date == null) {
            return null;
        }
        return date.getTime();
    }


    /**
     * {@link TemporalAccessor}转换为 时间戳（从1970-01-01T00:00:00Z开始的毫秒数）
     */
    public static Long toEpochMilli(TemporalAccessor temporalAccessor) {
        if (Objects.isNull(temporalAccessor)) {
            return null;
        }
        return TemporalAccessorUtil.toEpochMilli(temporalAccessor);
    }

    /**
     * 将特定格式的日期转换为Date对象，支持非严格解析日期
     *
     * @param dateStr 特定格式的日期，例如：202409032400
     * @param format  格式，例如yyyy-MM-dd HH:mm
     * @return 日期对象
     */
    public static DateTime parse(CharSequence dateStr, String format) {
        return DateUtil.parse(dateStr, new SimpleDateFormat(format));
    }
}
